/*
 * AVRAssembler4.asm
 *
 *  Created: 2011-12-03 20:26:22
 *   Author: Mario
 */ 


.include "m16def.inc"
;czas
.def godziny	= R19
.def minuty		= R20
.def sekundy	= R21
.def dzien		= R22
.def miesiac	= R23
.def rok		= R24

;alarmy
.def almin1		= R0
.def algodz1	= R1
.def almin2		= R2
.def algodz2	= R3
.def almin3		= R4
.def algodz3	= R5
.def almin4		= R6
.def algodz4	= R7
.def mmin		= R25
.def mgodz		= R26
.def alstan		= R27
.def przstan		= R28


.org 0
	rjmp  RESET
	rjmp  PRZERWANIE0			
	rjmp  PRZERWANIE1
	rjmp  PRZERWANIE2

.org OVF2addr				
	rjmp  CZASH 	

RESET:
	ldi   r16, high(RAMEND)	; Main program start
	out   SPH,r16			; Set Stack Pointer to top of RAM
	ldi   r16, low(RAMEND)
	out   SPL, r16
	ldi   r16, (1<<AS2)		; Asynchronous Timer 2
	out   ASSR, r16			
	ldi   r16, (1<<TOIE2)	; Timer 2 Overflow Interrupt Enable
	out   TIMSK, r16 		
	ldi   r16, (1<<SE)		; Sleep Enable
	out   MCUCR, r16
	ldi   r16, 0b00000101  	; Prescale CK/128  (101)
    out   TCCR2, r16
	ldi   r16, (1<<(INT0|INT1|INT2))    ; External interrupt enable
	out   GICR, r16

START:
	ldi   godziny, 12         
	ldi   minuty, 00
	ldi   sekundy, 00

	ldi   dzien, 1         
	ldi   miesiac, 1
	ldi   rok, 12
	ldi	  mgodz, 0
	ldi   mmin, 0 
	ldi   alstan, 0b11111111
	ldi	  przstan, 0
    
	;operacja LDI operuje jedynie na 16<=Rd<=31, dane zmieniane rzadziej
	;umieszczamy zatem w innych rejestrach (zmiana ich wymaga wiekszej ilosci cyklow)
	ldi	 r16, 13  
	ldi	 r17, 0      
	mov  algodz1, r16
	mov  almin1, r17
	mov  algodz2, r16
	mov  almin2, r17
	mov  algodz3, r16
	mov  almin3, r17
	mov  algodz4, r16
	mov  almin4, r17

	rjmp  CZEKAJ

CZASH:
	inc	sekundy
	cpi	sekundy, 60
	breq ZWIEKSZMIN
	cpi minuty, 60
	breq ZWIEKSZGODZ
	cpi godziny, 24
	breq ZWIEKSZDATE
	rjmp  CZEKAJ


ZWIEKSZMIN:
	clr sekundy
	inc minuty
	rjmp  CZEKAJ

ZWIEKSZGODZ:
	clr minuty
	inc godziny
	rjmp  CZEKAJ

ZWIEKSZMIES:
	clr dzien
	inc miesiac
	cpi miesiac, 12
	breq ZWIEKSZROK
	rjmp  CZEKAJ

ZWIEKSZROK:
	clr miesiac
	inc rok
	rjmp  CZEKAJ


LUTY:
	cpi dzien, 29  
	brne CZEKAJ
	cpi miesiac, 2
	breq ZWIEKSZMIES


ZWIEKSZDATE:
	clr godziny
	inc dzien

	cpi dzien, 32  
	breq ZWIEKSZMIES

	cpi dzien, 31  
	brne LUTY

	cpi miesiac, 4  
	breq ZWIEKSZMIES

	cpi miesiac, 6
	breq ZWIEKSZMIES

	cpi miesiac, 9
	breq ZWIEKSZMIES

	cpi miesiac, 11
	breq ZWIEKSZMIES


	rjmp  CZEKAJ


CZEKAJ:
	sei
	cpi przstan, 0
	breq WYSW

	sbrc alstan, 0
	rjmp  ALARM1

	sbrc alstan, 1
	rjmp  ALARM2

	sbrc alstan, 2
	rjmp  ALARM3

	sbrc alstan, 3
	rjmp  ALARM4

	sleep

ALARM1:
	cp minuty, almin1 
	brne CZEKAJ
	cp godziny, algodz1 
	ldi r18, 66
	ldi alstan, (0<<0)
	breq BUDZIK
	rjmp CZEKAJ

ALARM2:
	cp minuty, almin2 
	brne CZEKAJ
	cp godziny, algodz2 
	ldi r18, 66
	ldi alstan, (0<<1)
	breq BUDZIK
	rjmp CZEKAJ

ALARM3:
	cp minuty, almin3 
	brne CZEKAJ
	cp godziny, algodz3 
	ldi r18, 66
	ldi alstan, (0<<2)
	breq BUDZIK
	rjmp CZEKAJ

ALARM4:
	cp minuty, almin4 
	brne CZEKAJ
	cp godziny, algodz4
	ldi r18, 66
	ldi alstan, (0<<3)
	breq BUDZIK
	rjmp CZEKAJ


PRZERWANIE0:

PRZERWANIE1:

PRZERWANIE2:

BUDZIK: 
	rjmp CZEKAJ

WYSW:
	ldi R17, 0b00000001
	out PORTD, R17
	mov R17, godziny
	com R17
	out PORTA, R17

	ldi R17, 0b00000010 
	out PORTD, R17
	mov R17, minuty
	com R17
	out PORTA, R17

	ldi R17, 0b00000100 
	out PORTD, R17
	mov R17, sekundy
	com R17
	out PORTA, R17
	ret